package xx.services.util;

import java.io.ByteArrayInputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.jersey.api.core.HttpResponseContext;

import xx.db.Xson;

/**
 * rest数据返回代理
 * 
 * @author chenx
 */
public class Results
{
    private static final Log log = LogFactory.getLog(Results.class);
    
    /** 返回JSON数据格式 */
    public static final int JSON = 1;

    /** 返回XML数据格式 */
    public static final int XML = 2;

    /** 返回HTML数据格式 */
    public static final int HTML = 3;

    // ---------------------------------------

    /** 成功返回数据 */
    private static final int OK = 200;

    /** 出错了 */
    private static final int ERROR = 300;

    /** 登陆超时了 */
    private static final int TIMEOUT = 301;

    /** 警告 */
    private static final int WARNING = 302;

    /** 返回到客户端的消息名称 */
    private final static String MESSAGE = "message";

    /** 返回到客户端的数据名称 */
    private final static String RESULT = "result";

    /** 返回到客户端的消息名称 */
    private final static String STATUS = "statusCode";

    // ----------------------------------------

    /** 返回的数据类型，取值范围为：[Results.JSON|Results.XML|Results.HTML] */
    private int dataType = JSON;

    // ----------------------------------------

    /** 存放需要返回到客户端的数据，如http请求状态，消息等 */
    private Map<String, Object> map;

    /**
     * 构造函数<br>
     * 默认返回JSON格式数据
     */
    public Results()
    {
        this(JSON);
    }

    /**
     * 构造函数
     * 
     * @param dataType
     *            -返回的数据类型
     *            <li>Results.JSON:表示返回json格式数据；</li>
     *            <li>Results.XML:表示返回xml格式数据；</li>
     *            <li>Results.HTML:表示返回html格式数据；</li>
     */
    public Results(final int dataType)
    {
        map = new HashMap<String, Object>();
        map.put(STATUS, OK);
        this.dataType = dataType;
    }

    /**
     * 成功
     * 
     * @param msg
     *            需要返回到客户端的消息
     * @return
     */
    public String succeed(Object msg)
    {
        return this.succeed(msg, null);
    }

    /**
     * 成功
     * 
     * @param msg
     *            需要返回到客户端的消息
     * @return
     */
    public String succeed(Object msg, Map<String, Object> other)
    {
        if (other != null)
        {
            this.map.putAll(other);
        }
        this.map.put(RESULT, msg);
        return toString();
    }

    /**
     * 出错了
     * 
     * @param msg
     *            需要返回到客户端的消息
     * @return
     */
    public String error(Object msg)
    {
        
        this.map.put(STATUS, ERROR);
        this.map.put(MESSAGE, msg);
        log.error(msg);
        return toString();
    }

    /**
     * 警告
     * 
     * @param msg
     *            需要返回到客户端的消息
     * @return
     */
    public String warning(Object msg)
    {
        this.map.put(STATUS, WARNING);
        this.map.put(MESSAGE, msg);
        return toString();
    }

    /**
     * 登陆超时了
     * 
     * @return
     */
    public String timeout()
    {
        log.warn("登陆超时，请重新登陆!");
        this.map.put(STATUS, TIMEOUT);
        this.map.put(MESSAGE, "登陆超时，请重新登陆!");
        return toString();
    }

    public byte[] toGzip()
    {
        return Xson.toGzipJson(map);
    }

    /**
     * 根据dataType输出对应的字符串
     * 
     * @return String
     */
    @Override
    public String toString()
    {
        try
        {
            if (this.dataType == JSON)
            {
                return Xson.toJson(map);
            }
            else if (this.dataType == XML)
            {
                return null;
            }
            else if (this.dataType == HTML)
            {
                return "" + map.get(map.containsKey(RESULT) ? RESULT : MESSAGE);
            }
            return null;
        }
        finally
        {
            // 垃圾回收
            System.gc();
        }
    }
    
    /**
     * 导出或者下载过程中，如果发生错误，则生成错误文件返回到页面
     * @param response
     * @param errorMsg
     */
    public static void createErrForDownOrExp(HttpServletResponse response,String errorMsg){
        try
        {
            response.reset();
            response.setContentType("application/x-msdownload");// iso-8859-1
            String fileName = "errorMessage" + ".txt";
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            OutputStream out = response.getOutputStream();
            StringBuffer sb = new StringBuffer();

            sb.append(errorMsg).append("\n");

            ByteArrayInputStream in = new ByteArrayInputStream(sb.toString().getBytes("GB2312"));
            int i = 0;
            byte[] buffer = new byte[1024];

            while ((i = in.read(buffer)) != -1)
            {
                out.write(buffer, 0, i);
            }
            out.close();
            out.flush();
            in.close();
        }
        catch (Exception s)
        {
            s.printStackTrace();
        }
    }
}
